﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL;
using DAL.Repositories;
using EntitiesLayer;
using System.Data.SqlClient;
using System.Data;


namespace BLL
{

    //falta manejar excepciones
    public class ConcreteGestor
    {
        //Prueba exitosa
        public bool insertarEstrella(string nombre, decimal masa, 
            decimal temperaturaMedia, TimeSpan duracion, int edad, string composicion, 
            decimal intensidadLuminica, decimal tamano)
        {
            try
            {
                Estrella e = new Estrella(
                    nombre: nombre,
                    masa: masa,
                    temperaturaMedia: temperaturaMedia,
                    duracion: duracion,
                    edad: edad,
                    composicion: composicion,
                    intensidadLuminica: intensidadLuminica,
                    tamano: tamano);

                UnitOfWork.EstrellaRepository.Insert(e);
                UnitOfWork.EstrellaRepository.Save();

            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                return false;
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                return false;
            }

            return true;
        }
        //PruebaExitosa!!
        public bool insertarPlaneta(string nombre, decimal masa, decimal temperaturaMedia, 
            TimeSpan duracion, decimal distanciaMedia, TimeSpan duracionAno)
        {
            try
            {
                Planeta planeta = new Planeta(

                    nombre: nombre,
                    masa: masa,
                    temperaturaMedia: temperaturaMedia,
                    duracion: duracion,
                    distanciaMedia: distanciaMedia,
                    cantidadSatelites: 0,
                    duracionAno: duracionAno
                    );

                UnitOfWork.PlanetaRepository.Insert(planeta);
                UnitOfWork.PlanetaRepository.Save();
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                return false;
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                return false;
            }

            return true;
           
        }
        //prueba exitosa
        public bool insertarSatelite(string nombre, decimal masa, decimal temperaturaMedia, 
            TimeSpan duracion, string caracteristicas, decimal distanciaPlaneta, int idPlaneta)
        {

            try { 
                Satelite satelite = new Satelite(

                        nombre: nombre,
                        masa: masa,
                        temperaturaMedia: temperaturaMedia,
                        duracion: duracion,
                        caracteristicas: caracteristicas,
                        distanciaPlaneta: distanciaPlaneta,
                        idPlaneta: idPlaneta
                    );

                UnitOfWork.SateliteRepository.Insert(satelite);
                UnitOfWork.SateliteRepository.Save();
            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                return false;
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                return false;
            }

            return true;
        }
        //prueba exitosa
        public bool insertarPrograma(string nombre, DateTime fecha, DateTime fechaFinalizacion, string alcance)
        {
            try { 
                ProgramaEspacial programa = new ProgramaEspacial(
                        nombre: nombre,
                        fecha: fecha,
                        fechaFinalizacion: fechaFinalizacion,
                        alcance: alcance
                    );

                UnitOfWork.ProgramaRespository.Insert(programa);
                UnitOfWork.ProgramaRespository.Save();

            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                return false;
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                return false;
            }

            return true;
        }

        //Prueba exitosa sin el bitmap
        public bool insertarMission(string nombre, string tripulantes, 
            DateTime fechaLanzamiento, TimeSpan duracion, string datosInteres, string resultado, 
            System.Drawing.Bitmap insignia, string nave, int idCuerpoCeleste, int idProgramaEspacial)

        {
            try
            {
                Mission mission = new Mission(
                    nombre: nombre,
                    tripulantes: tripulantes,
                    fechaLanzamiento: fechaLanzamiento,
                    duracion: duracion,
                    datosInteres: datosInteres,
                    resultado: resultado,
                    insignia: insignia,
                    nave: nave,
                    idCuerpoCeleste: idCuerpoCeleste,
                    idProgramaEspacial: idProgramaEspacial

                    );

                UnitOfWork.MissionRepository.Insert(mission);
                UnitOfWork.MissionRepository.Save();
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                return false;
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                return false;
            }

            return true;
        }

        //Prueba exitosa.
        public IEnumerable<Estrella> listarEstrella()
        {

            try
            {
                return UnitOfWork.EstrellaRepository.GetAll();
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                
            }

            return null;
        }
        //Prueba exitosa.

        public Dictionary<int ,string> listarPlanetaInfo()
        {
            try
            {
                IEnumerable<Planeta> planetas= UnitOfWork.PlanetaRepository.GetAll();
                if (planetas != null)
                    return planetas.toDictionary();
            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);

            }

            return null;
        }
        
        public IEnumerable<Planeta> listarPlaneta()
        {
            try
            {
                return UnitOfWork.PlanetaRepository.GetAll();
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                
            }

            return null;
        }

        //Pruena exitosa
        public IEnumerable<Satelite> listarSatelite()
        {
            try
            {
                return UnitOfWork.SateliteRepository.GetAll();
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);

            }

            return null;
        }
        //prueba exitosa
        public IEnumerable<ProgramaEspacial> listarPrograma()
        {
            try{
                return UnitOfWork.ProgramaRespository.GetAll();
                
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                
            }

            return null;
       
        }
        public Dictionary<int, string> listarProgramaInfo()
        {
            try
            {
                IEnumerable<ProgramaEspacial> programas = UnitOfWork.ProgramaRespository.GetAll();

                if (programas != null)
                    return programas.toDictionary();
                

            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);

            }

            return null;
        }
        //Prueba exitosa sin el bitmap
        public IEnumerable<Mission> listarMission()
        {
            try
            {

                return UnitOfWork.MissionRepository.GetAll();
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);
                
            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                
            }

            return null;
        }

        //Prueba exitosa.
        public IList<Satelite> satelitesDePlaneta(int idPlaneta)
        {
            try
            {
                Planeta planeta = UnitOfWork.PlanetaRepository.GetById(idPlaneta);


                return planeta != null ? planeta.ListaSatelite : null;
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                
            }

            return null;
        }

        //preba exitosa (falta probar el bitmap con una imagen de verdad)
        public IList<Mission> missionesDeProgramaEspacial(int idProgramaEspacial)
        {
            try
            {
                ProgramaEspacial espacial = UnitOfWork.ProgramaRespository.GetById(idProgramaEspacial);

                return espacial != null ? espacial.ListaMissiones : null;
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);

            }

            return null;
        }

        // prueba exitosa(falta probar el bitmap con una imagen de verdad)
        public IList<Mission> missionesDeCuerpoCeleste(int idCuerpoCeleste)
        {
            try
            {
                CuerpoCeleste cuerpo = UnitOfWork.CuerpoCelesteRepository.GetById(idCuerpoCeleste);

                return cuerpo != null ? cuerpo.ListaMissiones : null;
            } 
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);
                
            }

            return null;
        }
        //Prueba exitosa.

        public IEnumerable<CuerpoCeleste> listarCuerposCelestes() {

            try {

                return UnitOfWork.CuerpoCelesteRepository.GetAll();
            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);

            }

            return null;
        }

        public Dictionary<int, string> listarCuerposCelestesInfo()
        {

            try
            {

                IEnumerable<CuerpoCeleste> cuerpos=UnitOfWork.CuerpoCelesteRepository.GetAll();

                if (cuerpos != null)
                    return cuerpos.toDictionary();

            }
            catch (SqlException ex)
            {
                //case con los codigos
                Console.WriteLine(ex.Message);

            }
            catch (ApplicationException ex)
            {

                Console.WriteLine(ex.Message);

            }

            return null;
        }

        public bool asinarMissionPrograma(int idPlaneta, int idSatelite)
        {
            throw new NotImplementedException();

        }


    }
}
